package com.crm.customers.service.impl;

import java.util.HashMap;
import java.util.List;
import java.util.Map;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import com.crm.customers.dao.ContractDao;
import com.crm.customers.dao.ContractPerformanceDao;
import com.crm.customers.model.Contract;
import com.crm.customers.model.ContractPerformance;
import com.crm.customers.service.ContractPerformanceService;

@Service("contractPerformanceService")
public class ContractPerformanceServiceImpl implements ContractPerformanceService {
	
	@Autowired
	private ContractPerformanceDao contractPerformanceDao;
	
	@Autowired
	private ContractDao contractDao;

	@Override
	public void insertContractPerformance(Long conid,String arrivaltime) {
		
		//在计算业绩的时候，业绩的时间应该是按到帐时间计算，而不是按照审批时间计算
		
		//根据合同id判断有没有生成记录
		int result = contractPerformanceDao.checkIsExist(conid).size();
		//如果没有记录,创建记录
		if (result < 1) {
			//创建一个合同对象,根据合同id获取合同详情
			Contract c = new Contract();
			c.setId(conid);
			c = contractDao.selectByPrimaryKey(c);
			
			/*
			 * 现在计算业绩的方式改变了。
			 * 有几个参数：合同总金额 单合同金额 人才证书金额 其他金额 回扣金额(介绍费)
			 * 首要条件 如果人才证书金额为0不计算业绩
			 * 从人才开始算业绩：
			 * 如果其他金额为null或为0
			 * 人才业绩=（单合同金额 - 人才证书金额） /2
			 * 如果其他金额大于0
			 * 人才业绩=（单合同金额 - 人才证书金额 - 其他金额 - 回扣金额） /2
			 * 然后再算企业业绩：
			 * 等于所有人才业绩之和
			 * */
			ContractPerformance cp = new ContractPerformance();
			cp.setConid(conid);
			cp.setCreatedate(arrivaltime);
			//当时挂靠合同时 计算业绩 
			if(c.getContracttype()==1) {

				//先计算人才合同业绩
				List<Contract> list = c.getSublist();
				//int size = list.size();
				//所有人才总业绩
				int allcusmoney = 0;
				//金钱标记
				int moneysign;
				for (Contract ct : list) {
					cp.setUid(ct.getUid());
					cp.setType(0);
					//首要条件：人才证书价格为0不计算业绩
					if (ct.getTotalamount() >= 0) {
						//进行判断 是否有其他金额,
	 					
						if (ct.getOthermoney() != null && ct.getOthermoney() > 0) {
							//有其他金额的
							moneysign = (ct.getAlonemoney()-ct.getTotalamount()-ct.getOthermoney())/2;
							cp.setMoney(moneysign);
							allcusmoney += moneysign;
						} else {
							//没有其他金额的
							moneysign = (ct.getAlonemoney()-ct.getTotalamount())/2;
							cp.setMoney(moneysign);
							allcusmoney += moneysign;
						}
						cp.setSubid(ct.getId());
						cp.setCreatedate(arrivaltime);
						//业绩等于0的不存
						if (cp.getMoney() > 0) {
							contractPerformanceDao.insertContractPerformance(cp);
						} 
					}
				}
				//企业合同业绩就是人才总业绩
				cp.setSubid(0);
				cp.setUid(c.getUid());
				cp.setType(1);
				cp.setMoney(allcusmoney);
			}else if(c.getContracttype()==2) {
				//当合同为培训合同时，按合同价格算业绩
				cp.setSubid(0);
				cp.setUid(c.getUid());
				cp.setType(1);
				cp.setMoney(c.getTotalamount());
			}else if(c.getContracttype()==0) {
				//当合同为资质合同时，按服务费算业绩
				cp.setSubid(0);
				cp.setUid(c.getUid());
				cp.setType(1);
				cp.setMoney(c.getServicecharge());
			}
			contractPerformanceDao.insertContractPerformance(cp);
			
		}
	}

	@Override
	public void addContractPerformance(String arrivaltime, Contract c) {
		
		//因为在合同更新的时候,程序还没有运行结束,数据还没有存入数据库,所以不能使用数据库中的数据计算业绩
		
		/*
		 * 有几个参数：合同总金额 单合同金额 人才证书金额 其他金额 回扣金额(介绍费)
		 * 首要条件 如果人才证书金额为0不计算业绩
		 * 从人才开始算业绩：
		 * 如果其他金额为null或为0
		 * 人才业绩=（单合同金额 - 人才证书金额） /2
		 * 如果其他金额大于0
		 * 人才业绩=（单合同金额 - 人才证书金额 - 其他金额 - 回扣金额） /2
		 * 然后再算企业业绩：
		 * 等于所有人才业绩之和
		 * */
		ContractPerformance cp = new ContractPerformance();
		cp.setConid(c.getId());
		cp.setCreatedate(arrivaltime);
		if(c.getContracttype()==1) {
			//先计算人才合同业绩
			List<Contract> list = c.getSublist();
			//所有人才总业绩
			int allcusmoney = 0;
			//金钱标记
			int moneysign;
			for (Contract ct : list) {
				cp.setUid(ct.getUid());
				cp.setType(0);
				//首要条件：人才证书价格为0不计算业绩
				if (ct.getTotalamount() >= 0) {
					//进行判断 是否有其他金额,
						
					if (ct.getOthermoney() != null && ct.getOthermoney() > 0) {
						//有其他金额的
						moneysign = (ct.getAlonemoney()-ct.getTotalamount()-ct.getOthermoney())/2;
						cp.setMoney(moneysign);
						allcusmoney += moneysign;
					} else {
						//没有其他金额的
						moneysign = (ct.getAlonemoney()-ct.getTotalamount())/2;
						cp.setMoney(moneysign);
						allcusmoney += moneysign;
					}
					cp.setSubid(ct.getId());
					cp.setCreatedate(arrivaltime);
					//业绩等于0的不存
					if (cp.getMoney() > 0) {
						contractPerformanceDao.insertContractPerformance(cp);
					} 
				}
			}
		//企业合同业绩就是人才总业绩
				cp.setSubid(0);
				cp.setUid(c.getUid());
				cp.setType(1);
				cp.setMoney(allcusmoney);
		}else if(c.getContracttype()==2) {
			//当合同为培训合同时，按合同价格算业绩
			cp.setSubid(0);
			cp.setUid(c.getUid());
			cp.setType(1);
			cp.setMoney(c.getTotalamount());
		}else if(c.getContracttype()==0) {
			//当合同为资质合同时，按服务费算业绩
			cp.setSubid(0);
			cp.setUid(c.getUid());
			cp.setType(1);
			cp.setMoney(c.getServicecharge());
		}
		contractPerformanceDao.insertContractPerformance(cp);		
		
	}

	@Override
	public int checkPerformanceExist(Long conid) {
		return contractPerformanceDao.checkIsExist(conid).size();
	}
	
	@Override
	public Map<String,Object> getPerFormanceByUid(Long uid) {
		Map<String,Object> map = new HashMap<String,Object>();
		List<ContractPerformance>  list = contractPerformanceDao.getPerFormanceByUid(uid);
		int  totalmoneyFromDays = contractPerformanceDao.selDayPerformanceByUid(uid); //当天业绩
		List<ContractPerformance>   allUserPerformancelist = contractPerformanceDao.selAllUserPerformance();
		Map<Integer,Integer> per  = new HashMap<Integer,Integer>();
		int summoney = 0;//总业绩
		int minmoney = 0;//最小业绩
		int maxmoney = 0;//最大业绩
		int pjyj =0 ;//平均业绩
		int j =0;
		for(ContractPerformance o:list){
			int  month = Integer.parseInt(o.getSttime());
			summoney +=o.getMoney();
			if(j==0){
				minmoney = o.getMoney();
				maxmoney = o.getMoney();
			}else{
				if(o.getMoney()<minmoney){
					minmoney = o.getMoney();
				}
				if(o.getMoney()>maxmoney){
					maxmoney = o.getMoney();
				}
			}
			per.put(month, o.getMoney());
			j++;
		}
		try{
			pjyj = summoney/list.size();
		}catch(Exception e){
			
		}
		map.put("max", maxmoney);
		map.put("min", minmoney);
		map.put("pj", pjyj);
		
		
		Integer[] moeny = new Integer[12];
		for(int i=0;i<12;i++){
			moeny[i]= per.get(i+1);
		}
		map.put("yj", moeny);
		map.put("totalmoneyFromDays",totalmoneyFromDays);
		map.put("allUserPerformancelist",allUserPerformancelist);
		return map;
	}
	
	@Override
	public int deleteContractPerformance(Long conid) {
		return contractPerformanceDao.deleteContractPerformance(conid);
	}
}
